from docx import Document
import json
from ConfigManager import ConfigManager
from LLMProcess import LLMProcess
from WordProcessor import WordProcessor
from DocxStyleHandler import DocxStyleHandler
from JsonUtil import JsonUtil
import Logger_config

# 设置日志配置
logger = Logger_config.setup_logger()
class test  :
    def __init__(self):        

        self.cm = ConfigManager()

    def invokeLLM(self):        

        wp = WordProcessor()
        content = wp.read_word_document(r"C:\Users\cheng\Desktop\产业数智化产品部部门简讯（第19周，2025年05月05日-2025年05月09日）.docx")
        userprompt = f"""
            - 标题层级 | 字体字号样式对齐
            - 一级标题 | 黑体 16pt 加粗 居中
            - 二级标题 | 楷体_GB2312 14pt 加粗
            - 三级标题 | 楷体_GB2312 14pt 加粗
            - 四级标题 | 楷体_GB2312 12pt 加粗
            - 正文 | 仿宋_GB2312 12pt
            - 禁用其他字体

            【文档内容】如下：
            {content}
            """
        model_base_url = self.cm.get_merged_config()['model']['base_url']  # 模型的基础URL
        model_api_key = self.cm.get_merged_config()['model']['api_key']  # 模型的API密钥
        model_name = self.cm.get_merged_config()['model']['model_name']  # 模型名称
        model_max_tokens = self.cm.get_merged_config()['model']['max_tokens']  # 设置模型生成的最大token数，控制生成内容的长度
        model_temperature = self.cm.get_merged_config()['model']['temperature']  # 设置模型的温度参数，控制生成内容的随机性，值越高生成的内容越随机
        model_stream = self.cm.get_merged_config()['model']['stream']  # 设置是否以流式方式获取模型生成的内容，True表示逐步返回生成结果，False表示一次性返回
        systempromt = self.cm.get_merged_config()['system_prompt']['style']  
        prompts = [
                    {"role": "system", "content": systempromt},
                    {"role": "user", "content": userprompt}
                ]
        llm_result = LLMProcess.getLLMTextResponse(model_name,model_api_key,model_base_url,model_max_tokens,model_temperature,model_stream,prompts)
        logger.info(f"结果：{llm_result}")
        word_styles = JsonUtil.reshape(llm_result)#重新整理JSON格式

        try:             
            formatted_word_styles = json.loads(word_styles)
        except json.JSONDecodeError as e:
            logger.error(f"JSON字符串不符合JSON标准。错误信息: {e}")
            logger.error(f"原始内容: {word_styles}")
            return False,f"JSON字符串不符合JSON标准。错误信息: {e}"
        
        dsh = DocxStyleHandler()
        # 打开并读取文档内容
        doc = Document()
        dsh.create_or_update_styles(doc, formatted_word_styles)
        systempromt = """
        【排版要求】
        请在【文档内容】中应用【样式库】进行排版，只能使用样式库中的已定义的样式名称，不能使用其他样式名称。
        【输出规范】：返回JSON结构
        1. 必须严格符合json标准规范，以{开头，以}结尾，不要包含任何额外信息或解释

        正确输出示例：
        {
            "paragraphs": [
                {
                    "t": "这是一级标题",
                    "s": "h1"
                },
                {
                    "t": "这是二级级标题",
                    "s": "h2"
                },
                {
                    "t": "这是正文内容",
                    "s": "p1"
                }
            ]
        }
        """
        userprompt=f"""
            【样式库】：
            {word_styles}
            【文档内容】：
            {content}
            """
        prompts = [
                    {"role": "system", "content": systempromt},
                    {"role": "user", "content": userprompt}
                ]
        llm_result = LLMProcess.getLLMTextResponse(model_name,model_api_key,model_base_url,model_max_tokens,model_temperature,model_stream,prompts)
        logger.info(f"样式应用结果：{llm_result}")
        applied_content = JsonUtil.reshape(llm_result)#重新整理JSON格式

        try:             
            formatted_word_content = json.loads(applied_content)
        except json.JSONDecodeError as e:
            logger.error(f"JSON字符串不符合JSON标准。错误信息: {e}")
            logger.error(f"原始内容: {formatted_word_content}")
    
        dsh.apply_styles_and_save(doc,formatted_word_content)        

if __name__ == "__main__":
    # 创建 test 类的实例
    test_instance = test()

    

    # 调用 invokeLLM 方法
    test_instance.invokeLLM()